Spring Boot 集成 resteasy篇 — jax-rs初步介绍和spring boot集成

Spring Boot 集成 resteasy篇 — jax-rs初步介绍和spring boot集成

JAX-RS 是代表restful web service的一套规范API,JAX-RS规范基于JAVA编程语言,它是用来创建Restful 风格的web services服务的。Jax-rs使用一系列注解来简化java开发。

JAX-RS也称jsr339 (全称java specifications requests java规范提案第339个),由jcp(java community process)组织经过投票通过。

为了加深对jsr的理解,举一个简单的例子,jsr 330标准就是依赖注入的提案,已经通过。

规范说明

规范定义了一些常见的注解(见下表),用来标注一种资源文件为restfun风格的资源文件

序号 注解 描述
1 @Path 类或者方法的相对地址,标注在类或者方法上
2 @GET HTTP GET请求用,用来获取资源
3 @PUT HTTP PUT 请求,用来创建资源
4 @POST HTTP POST 请求, 用来创建或者更新资源
5 @DELETE HTTP DELETE请求, 用来删除资源
6 @HEAD HTTP HEAD请求, 用来获取一个接口是否可用的状态
7 @Produces 返回数据的格式比如APPLICATION/XML, TEXT/HTML, APPLICATION/JSON
8 @Consumes 请求数据格式 , 如json
9 @PathParam 绑定url里面的参数
10 @QueryParam 绑定url后面的参数(?后面的)
11 @MatrixParam 绑定包含多个 property (属性)=value(值) 方法参数表达式
12 @HeaderParam 给header里面传参
13 @CookieParam 给cookie里面传参
14 @FormParam 给form传参
15 @DefaultValue 给参数一个默认值
16 @Context 可以注入HttpRequest,HttpResponse用

规范实现

下文将以resteasy为例

包引入

1
2
3
4
5
6
7
8
9
10
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxrs</artifactId>
<version>${resteasy.version}</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxb-provider</artifactId>
<version>${resteasy.version}</version>
</dependency>

resteasy使用ServletContainerInitializer 接口来初始化项目,如果要开启启动扫描,扫描providers和resources。还需要引入另外一个包。

1
2
3
4
5
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-servlet-initializer</artifactId>
<version>${resteasy.version}</version>
</dependency>

跟spring集成,还需要spring的包

1
2
3
4
5
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-spring</artifactId>
<version>${resteasy.version}</version>
</dependency>

还有一些解析json之类的包

1
2
3
4
5
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jackson2-provider</artifactId>
<version>${resteasy.version}</version>
</dependency>

resteasy根据servlet容器的不同,还有些不同,这里讲的是spring boot继承,不过多赘述,详细见这里 , 尽管引了这些包,项目也没有和spring boot集成起来,因为项目不能autoconfigure,还有servlet也没有配置的地方。

这里我提供一个思路,实现 BeanFactoryPostProcessor接口 ,在postProcessBeanFactory 去创建servlet

Spring Boot集成

另外我提供一种比较简单的方法,直接使用开源集成,这里使用的是paypal开源的一个集成方案。

  • 引入包

    1
    2
    3
    4
    5
    6
    <dependency>
    <groupId>com.paypal.springboot</groupId>
    <artifactId>resteasy-spring-boot-starter</artifactId>
    <version>2.3.0-RELEASE</version>
    </dependency>
    <!--PS,上面的那一堆包不用引了,这个就帮我们引入了-->
  • 引入spring boot的一堆包

用法

  • 指定servletMapping路径

    写一个类继承Application,然后交给spring管理

    1
    2
    3
    4
    5
    @Component
    @ApplicationPath("/v1/")
    public class ApplicationPathImpl extends Application {
    }

  • 编写restful接口啦

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    @Component
    @Path("province/")
    public class ExternalFacadeImpl implements ExternalFacade {
    /**
    * http://localhost:8080/v1/province/city/1
    * @param id
    * @return
    */
    @Path("city/{id}")
    @GET
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_JSON)
    @Override
    public Result<Boolean> getCity(@PathParam("id") Long id) {
    return new Result<>();
    }
    }

下一篇将介绍常用注解作用

Share